import * as vscode from "vscode";
import { getFileSize } from "@ap/util/fs";
import { Box3Post } from "@ap/util/request";
import { CommandId } from "@ap/command";
import fs from "fs/promises";
/**
 * 打开文件选择对话框，允许用户选择文件，然后调用回调函数处理
 * @param options 文件对话框的选项
 * @param callback 选择文件后的回调函数
 */
export default async function openFileSelected(
  options: vscode.OpenDialogOptions,
  callback: Function,
  CommandId?: CommandId,
) {
  // 显示文件打开对话框，等待用户选择文件
  const result = await vscode.window.showOpenDialog(options);
  // 如果用户选择了文件，则开始上传
  if (result !== undefined) {
    uploadFiles(result, callback, CommandId);
  }
}

/**
 * 上传用户选择的所有文件
 * @param files 被选择的文件数组
 * @param callback 文件上传后的回调函数
 */
async function uploadFiles(
  files: vscode.Uri[],
  callback: Function,
  CommandId?: CommandId,
): Promise<void> {
  // 遍历每个文件并上传
  for (const fileUri of files) {
    try {
      await uploadFile(fileUri, callback);
    } catch (error) {
      // 如果文件读取失败，显示错误消息
      vscode.window.showErrorMessage(`读取文件失败: ${error}`);
    }
  }
  setTimeout(() => {
    if (CommandId) {
      vscode.commands.executeCommand(CommandId);
    }
  }, 500);
}

/**
 * 上传文件到服务器
 * @param fileUri 文件的 URI
 * @param fileContent 文件的内容，以 Blob 格式
 * @param callback 文件上传后的回调函数
 */
async function uploadFile(
  fileUri: vscode.Uri,
  callback: Function,
): Promise<void> {
  try {
    // 读取图片文件
    const imageBuffer = await fs.readFile(fileUri.fsPath);
    // 创建 FormData 对象，用于提交文件
    let formData = new FormData();
    // 将文件添加到 FormData 对象中
    formData.append("file", new Blob([imageBuffer]), "blob");

    // 准备请求选项
    const requestOptions = {
      url: "file-upload-auth",
      data: formData,
      headers: {
        "Content-Type": "multipart/form-data",
      },
    };
    // 发送文件上传请求
    const response = await Box3Post(requestOptions, "文件上传");
    // 如果响应异常或状态码不是 200，显示错误消息
    if (!response || response.code !== 200) {
      vscode.window.showErrorMessage(`文件上传失败: ${response.msg}`);
      return;
    }
    // 创建 FormData 对象，用于提交文件
    formData = new FormData();
    // 将文件添加到 FormData 对象中
    formData.append(
      "file",
      new Blob([JSON.stringify({ hash: response.data })], {
        type: "application/json",
      }),
      "blob",
    );
    requestOptions["data"] = formData;
    // 发送文件上传请求
    const response2 = await Box3Post(requestOptions, "文件上传");
    response2["name"] = fileUri.path.split("/").pop();
    response2["size"] = await getFileSize(fileUri.fsPath);
    response2["hash"] = response2.data;
    response2["data"] = response.data;
    // 调用回调函数处理上传成功的响应
    callback(response2);
  } catch (error) {
    // 如果上传过程中发生错误，显示错误消息
    vscode.window.showErrorMessage(`文件上传失败: ${error}`);
  }
}
